home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / string.c < prev    next >
C/C++ Source or Header  |  1992-05-10  |  6KB  |  256 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5.  
  6. /* 文字列処理関係 */
  7.  
  8. /* 表示した時の半角スペース数 */
  9. int
  10. string_disp_len(STR s)
  11. {
  12. #asm
  13.  
  14. XCODE_UP    equ    $0ff    * 拡張コードの開始 */
  15.  
  16. XCODE_MARK    equ    $020    * マーク 0x20 - 0x29 */
  17. XCODE_SYSMARK    equ    $030    * システムマーク 0x30 - 0x3f */
  18. XCODE_MARKLAST    equ    $03f    * マークの最後 */
  19.  
  20. XCODE_UL    equ    $040    * 下線 */
  21.  
  22. XCODE_RB10    equ    $050    * 予約:1文字真ん中ルビ */
  23. XCODE_RB1    equ    $051    * 1文字ルビ(半角用) */
  24. XCODE_RB1L    equ    $052    * 1文字ルビ左(全角用) */
  25. XCODE_RB1R    equ    $053    * 1文字ルビ右(全角用) */
  26. XCODE_RB2    equ    $054    * 2文字ルビ(全角用) */
  27.  
  28.     movem.l    d1-d2/a0,string_disp_len_save
  29.     moveq.l #0,d0    * d0 returns disp length
  30.     move.l 4(sp),a0    * a0 = pointer to string
  31.  
  32. USERL16:
  33.     move.b (a0)+,d1    * 1 byte move
  34.     bmi USERL40    * 2 byte code check
  35.     beq USERL30    * eof then return
  36.  
  37.     addq.l    #1,d0    * anyway add 1
  38.     cmp.b #$20,d1    * control code ?
  39.     bge USERL16    * normal 1 byte code($20 - $7f)
  40.     cmp.b #'I'-'@',d1    * TAB
  41.     bne USERL17
  42. *0-7 -> 8, 8-15 -> 16...
  43. *already add 1 then 1-8 -> 8, 9-16 -> 16...
  44. *    addq.l #7,d0
  45.     add.w _TAB_LENGTH_1,d0
  46. *    andi.w #%1111_1111_1111_1000,d0    * mask
  47. * d0 から d0 mod TAB_LENGTH を引く
  48.     move.l d0,d2    * コピー
  49.     divu.w _TAB_LENGTH,d2
  50.     swap d2
  51.     sub.w d2,d0
  52.     bra USERL16
  53. USERL17
  54.     addq.l #1,d0    * control code is 2 disp_length
  55.     bra USERL16
  56.  
  57. USERL40:
  58.     cmp.b #$ff,d1    * xcode ?
  59.     bne USERL405    * not xcode
  60.  
  61.     move.b (a0)+,d1    * get next byte
  62.     beq USERL30
  63.     cmp.b #XCODE_UL,d1    * 2 byte xcode ?
  64.     ble USERL16    * underline -> loop again
  65.     cmp.b #XCODE_RB1R,d1    * ....
  66.     bgt USERL403
  67.     tst.b (a0)
  68.     beq USERL30
  69.     tst.b 1(a0)
  70.     beq USERL30
  71.     addq.l #2,a0    * 1 char RUBI
  72.     bra USERL16
  73. USERL403:        * 2 char RUBI
  74.     tst.b (a0)
  75.     beq USERL30
  76.     tst.b 1(a0)
  77.     beq USERL30
  78.     tst.b 2(a0)
  79.     beq USERL30
  80.     tst.b 3(a0)
  81.     beq USERL30
  82.     addq.l #4,a0
  83.     bra USERL16
  84. USERL405:
  85.     addq.l #1,d0    * anyway add 1
  86.     cmp.b #$a0,d1
  87.     blt USERL41
  88.     cmp.b #$e0,d1
  89.     blt USERL16    * normal katakana
  90.  
  91.     tst.b (a0)+    * next byte
  92.     beq USERL30
  93.     cmp.b #$f0,d1    * 1/4 kaku ?
  94.     bge USERL16
  95.     addq.l #1,d0    * normal zenkaku(block 2)
  96.     bra USERL16
  97.  
  98. USERL41:
  99.     tst.b (a0)+    * next byte
  100.     beq USERL30
  101.     cmp.b #$80,d1    * hankaku hiragana ?
  102.     beq USERL16
  103.     addq.l #1,d0    * normal zenkaku(block 1)
  104.     bra USERL16
  105. USERL30:
  106.     movem.l    string_disp_len_save,d1-d2/a0
  107.     rts
  108.     .data
  109.     .even
  110. string_disp_len_save
  111.     ds.l    3
  112.  
  113. #endasm
  114. }
  115.  
  116. int
  117. string_1or2_byte_code(UINT c)
  118. {
  119.     if (c >= 0x100) {
  120.         c >>= 8;
  121.     }
  122.     if (c && (iskanji(c) || buff_ishan2byte(c))) {
  123.             /* 漢字の1バイト目? or 2バイト半角文字 */
  124.             return(2);
  125.     }
  126.     return(1);    /* EOS は1バイトコード */
  127. }
  128.  
  129. /* 最初に見つかった拡張コードのアドレスを返す */
  130. /* なければ NULL を返す */
  131. STR
  132. string_search_xcode(register STR p)
  133. {
  134.     while(*p) {
  135.         if (*p == XCODE_UP) {
  136.             return(p);
  137.         } else {
  138.             p += etc_char_byte_haba(p);
  139.         }
  140.     }
  141.     return((STR) NULL);
  142. }
  143.  
  144. /* 2つの行の間で送り出しがあるかどうかをチェックする */
  145. /* -1など = 前へ送った、0 = 送り無し、1など = 後ろへ送った */
  146. int
  147. string_2unit_check(UNIT *p1,UNIT *p2)
  148. {
  149.     UBYTE w1[VERY_LONG_LINE],w2[VERY_LONG_LINE];
  150.  
  151.     line_get_body(w1,p1);
  152.     line_get_body(w2,p2);
  153.     return(string_2line_check(w1,w2));
  154. }
  155.  
  156. /* 2つの行の間で送り出しがあるかどうかをチェックする */
  157. /* -1 = 前へ送った、0 = 送り無し、1 = 後ろへ送った */
  158. int
  159. string_unit_line_check(UNIT *p1,STR s2)
  160. {
  161.     UBYTE w1[VERY_LONG_LINE];
  162.  
  163.     line_get_body(w1,p1);
  164.     return(string_2line_check(w1,s2));
  165. }
  166.  
  167. /* 2つの文字列の間で送り出しがあるかどうかをチェックする */
  168. /* - = 前へ送った、0 = 送り無し、+ = 後ろへ送った */
  169. /* 送ったバイト数を返す */
  170. int
  171. string_2line_check(STR s1,STR s2)
  172. {
  173.     UBYTE w[VERY_LONG_LINE * 2],w0[VERY_LONG_LINE * 2];
  174.     int l2;
  175.  
  176.     strcpy(w,s1);
  177.     l2 = strlen(s2);
  178.     strcat(w,s2);
  179.     return(cut_line(w,w0,w,CURRENT_JIZUME) - l2);
  180. }
  181.  
  182. /* メインの文字列だけにする */
  183. /* 使わないけど文字列の長さを返すかも知れない */
  184. int
  185. string_to_main_string(STR d,STR s)
  186. {
  187.     register UBYTE c;
  188.  
  189.     while(1) {
  190.         if (c = *s++) {    /* 終了ではない */
  191.             if (c == XCODE_UP) {
  192.                 switch(*s++) {
  193.                 case XCODE_MARK+0:
  194.                 case XCODE_MARK+1:
  195.                 case XCODE_MARK+2:
  196.                 case XCODE_MARK+3:
  197.                 case XCODE_MARK+4:
  198.                 case XCODE_MARK+5:
  199.                 case XCODE_MARK+6:
  200.                 case XCODE_MARK+7:
  201.                 case XCODE_MARK+8:
  202.                 case XCODE_MARK+9:    /* マーク 0x20 - 0x29 */
  203.                 case XCODE_MARK+10:
  204.                 case XCODE_MARK+11:
  205.                 case XCODE_MARK+12:
  206.                 case XCODE_MARK+13:
  207.                 case XCODE_MARK+14:
  208.                 case XCODE_MARK+15:
  209.  
  210.                 case XCODE_SYSMARK+0:    /* システムマーク */
  211.                 case XCODE_SYSMARK+1:
  212.                 case XCODE_SYSMARK+2:
  213.                 case XCODE_SYSMARK+3:
  214.                 case XCODE_SYSMARK+4:
  215.                 case XCODE_SYSMARK+5:
  216.                 case XCODE_SYSMARK+6:
  217.                 case XCODE_SYSMARK+7:
  218.                 case XCODE_SYSMARK+8:
  219.                 case XCODE_SYSMARK+9:
  220.                 case XCODE_SYSMARK+10:
  221.                 case XCODE_SYSMARK+11:
  222.                 case XCODE_SYSMARK+12:
  223.                 case XCODE_SYSMARK+13:
  224.                 case XCODE_SYSMARK+14:
  225.                 case XCODE_SYSMARK+15:
  226.  
  227.                     break;
  228.                 case XCODE_UL:        /* 下線 */
  229.                     break;
  230.  
  231.                 case XCODE_RB10:    /* 予約:1文字真ん中ルビ */
  232.                 case XCODE_RB1:        /* 1文字ルビ */
  233.                 case XCODE_RB1L:    /* 1文字ルビ左(全角用) */
  234.                 case XCODE_RB1R:    /* 1文字ルビ右(全角用) */
  235.                     s += 2;        /* ルビであるから、2バイト文字 */
  236.                     break;
  237.                 case XCODE_RB2:        /* 2文字ルビ(全角用) */
  238.                     s += 4;        /* ルビであるから、2バイト文字 */
  239.                 }
  240.             } else {
  241.                 if (isprkana(c) || (c < 0x20)) {
  242.                         /* 普通の1バイトコード */
  243.                     *d++ = c;
  244.                 } else {        /* 2バイトコード:もしくは拡張 */
  245.                     *d++ = c;
  246.                     *d++ = *s++;
  247.                 }
  248.             }
  249.         } else {
  250.             *d = EOS;
  251.             break;        /* EOS で終わり */
  252.         }
  253.     }
  254. }
  255.  
  256.